package com.qi.demo01.Pool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author zjq
 * @date 2020/3/27 22:10
 */

/**
 * Executors 工具类、三大方法
 * 使用线程池之后，用线程池来创建线程。
 */
public class Demo {
    public static void main(String[] args) {

        // 最大线程到底如何创建？
        //1.CPU 密集型    几核CPU就是几个进程数，保持CPU效率最高
        //2.I/O 密集型     判断你程序中十分耗I/O的线程。
        //       程序 15个大型任务， I/O十分占用资源
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                2,//核心大小
                5,//最大进程数
                3,//超时等待
                TimeUnit.SECONDS,//
                new LinkedBlockingDeque<>(3),//空闲容量
                Executors.defaultThreadFactory(),
                //new ThreadPoolExecutor.AbortPolicy()// 线程池满了，还有人进来，不处理这个人并且抛出异常
                //new ThreadPoolExecutor.CallerRunsPolicy()//从哪来，回哪去。main发出，main执行
                //new ThreadPoolExecutor.DiscardPolicy()// 队列满了，丢掉任务，不抛出异常
                new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了，尝试去和最早的竞争，如果失败就抛弃，成功就执行。也不会抛弃异常
        );
        //最大承载=max+capacity
        for (int i = 0; i < 9; i++) {//超出最大承载，抛出异常java.util.concurrent.RejectedExecutionException
            threadPool.execute(() -> {
                System.out.println(Thread.currentThread().getName() + "ok");
            });
        }
        //程序结束，线程池关闭。
        threadPool.shutdown();


    }
}
